package com.cicc.beergamevirtualsimulationsystem.utils;

import cn.hutool.core.lang.hash.Hash;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;

@Component
public class JwtUtil {

    // 设置密钥，使用强随机生成的SecretKey
    private static final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    private static final long expirationTimeInMs = 36000000;  // Token过期时间为1小时

    // 生成Token
    public static String generateToken(String userId) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + expirationTimeInMs);
        HashMap<String, Object> claims = new HashMap<>();
        claims.put("userId", userId);

        return Jwts.builder()
                .setClaims(claims)
                .setSubject("simple")  // 将用户名设为Token的主题
                .setIssuedAt(now)      // 设置签发时间
                .setExpiration(expiryDate)  // 设置过期时间
                .signWith(secretKey)  // 使用生成的密钥签名
                .compact();
    }

    // 解析Token，提取负载中的所有声明（Claims）
    private static Claims extractAllClaims(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(secretKey)  // 设置签名密钥
                .build()
                .parseClaimsJws(token)
                .getBody();  // 返回Token中的声明
    }

    // 从Token中提取用户名
    public static String extractUserId(String token) {
        Claims claims = extractAllClaims(token);
        String userId = (String) claims.get("userId");
        return userId;
    }

    // 验证Token是否过期
    public static boolean isTokenExpired(String token) {
        return extractAllClaims(token).getExpiration().before(new Date());
    }

    // 验证Token是否有效
    public static boolean validateToken(String token, String username) {
        return (username.equals(extractUserId(token)) && !isTokenExpired(token));
    }
}
